﻿using InverseClockWork.Cutscenes;
using InverseClockWork.Cutscenes.Actions;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AddressableAssets;

namespace InverseClockWork.Extra.Cutscenes.Actions
{
    public class ActionAddrDialogBox : CutsceneAction
    {
        private readonly string config_addressableAddress = "ICW/Cutscenes/DialogBox";

        private static UnityEngine.ResourceManagement.AsyncOperations.AsyncOperationHandle<GameObject>? PrefabLoadOperation
        {
            get; set;
        } = null;

        private DialogBoxBehaviour BoxInstance
        {
            get; set;
        }
        private bool m_hasLoaded = false;

        public override void EndAction(FrameData frameData)
        {
            if (BoxInstance)
            {
                Destroy(BoxInstance.gameObject);
            }
        }

        public override void StartAction(FrameData frameData)
        {
            if (!PrefabLoadOperation.HasValue)
            {
                PrefabLoadOperation = Addressables.LoadAssetAsync<GameObject>(config_addressableAddress);
            }

            //Debug.Log(frameData.GetMetaDataWithInterface<IDialogMetaProvider>().ToString());
            m_hasLoaded = false;
        }

        public override void UpdateAction(FrameData frameData)
        {
            if (!m_hasLoaded && PrefabLoadOperation.HasValue && PrefabLoadOperation.Value.IsDone && !BoxInstance)
            {
                var go = Instantiate(PrefabLoadOperation.Value.Result);
                BoxInstance = go.GetComponent<DialogBoxBehaviour>();
                BoxInstance.Init(frameData.GetMetaDataWithInterface<InverseClockWork.Cutscenes.Metas.IDialogMetaProvider>());
                m_hasLoaded = true;
            }
        }

        public override void OnPause(FrameData frameData)
        {

        }

        public override void OnResume(FrameData frameData)
        {

        }

        protected override bool IsComplete(FrameData frameData)
        {
            return !BoxInstance && m_hasLoaded; //Don't allow completion if the prefab load hasn't completed and spawned the box yet
        }

        public override string ToString(CutsceneAsset asset, CutsceneDirector director)
        {
            var obj = asset?.GetMetadataObjectWithInterface<InverseClockWork.Cutscenes.Metas.IDialogMetaProvider>(Column);

            return "Dialog - " + (obj != null ? obj.ToString() : "EMPTY");
        }

        public override Color BlockColor => new Color(1.0f, 1.0f, 0.7f);
    }
}